ZQuest Classic Coverage Report


Directory: src/
File: src/gui/builder.h
Date: 2026-01-19 09:21:43
Exec Total Coverage
Lines: 0 329 0.0%
Functions: 0 16392 0.0%
Branches: 0 5824 0.0%

Line Branch Exec Source
1 #ifndef ZC_GUI_BUILDER_HPP
2 #define ZC_GUI_BUILDER_HPP
3
4 #include "gui/use_size.h"
5 #include "gui/button.h"
6 #include "gui/checkbox.h"
7 #include "gui/checkbox_qr.h"
8 #include "gui/colorsel.h"
9 #include "gui/common.h"
10 #include "gui/ditherprev.h"
11 #include "gui/drop_down_list.h"
12 #include "gui/frame.h"
13 #include "gui/separator.h"
14 #include "gui/grid.h"
15 #include "gui/key.h"
16 #include "gui/label.h"
17 #include "gui/qrpanel.h"
18 #include "gui/ddpanel.h"
19 #include "gui/radio.h"
20 #include "gui/radioset.h"
21 #include "gui/size.h"
22 #include "gui/slider.h"
23 #include "gui/switcher.h"
24 #include "gui/tabpanel.h"
25 #include "gui/tabref.h"
26 #include "gui/list.h"
27 #include "gui/scrolling_pane.h"
28 #include "gui/text_field.h"
29 #include "gui/window.h"
30 #include "gui/widget.h"
31
32 #ifdef IS_EDITOR
33 #include "zq/gui/seltile_swatch.h"
34 #include "zq/gui/selcombo_swatch.h"
35 #include "zq/gui/selherotile_swatch.h"
36 #include "zq/gui/tileanim_frame.h"
37 #include "zq/gui/msgstr_preview.h"
38 #include "zq/gui/palette_frame.h"
39 #include "zq/gui/cornerselect.h"
40 #include "zq/gui/misc_cset_sel.h"
41 #include "zq/gui/misc_color_sel.h"
42 #include "zq/gui/misc_color_row.h"
43 #include "zq/gui/dmap_minimap.h"
44 #include "zq/gui/dmap_mapgrid.h"
45 #include "zq/gui/dmap_frame.h"
46 #include "zq/gui/regiongrid.h"
47 #include "zq/gui/engraving.h"
48 #endif
49
50 #include <initializer_list>
51 #include <memory>
52 #include <string>
53 #include <string_view>
54
55 // These have to be included in order after the ones above.
56 #include "gui/macros.h"
57 #include "gui/props.h"
58
59 extern int32_t zq_screen_w, zq_screen_h;
60
61 /*
62 * A brief explanation of how this works:
63 *
64 * Each property name is a global variable of a unique type. That type has
65 * an inner class template instantiated by its operator=. For instance,
66 * the property checked is an instance of checkedProp, and checked=true
67 * returns an instance of checkedProp::Value<bool>.
68 *
69 * The builder classes have a generic applyProp function that rejects any
70 * argument as invalid. ZCGUI_ACCEPT_PROP adds a specialization for that
71 * property that calls the corresponding function on the widget. Similarly,
72 * the builders have an addChildren function that rejects all children.
73 * ZCGUI_ACCEPT_ONE_CHILD and ZCGUI_ACCEPT_MULTIPLE_CHILDREN add overloads
74 * that call the appropriate functions.
75 *
76 * A builder function calls the corresponding makeX function and creates
77 * a builder class, then passes everything to the applyArgs functions.
78 * If the first argument is a property, it calls the builder's applyProp
79 * function and calls applyArgs with the remaining arguments. If it's a widget
80 * pointer, it passes all the remaining arguments to addChildren.
81 */
82
83 namespace GUI::Internal
84 {
85
86 struct DummyType {};
87 static constexpr DummyType dummy={};
88
89 // Regular widgets
90
91 inline std::shared_ptr<Button> makeButton()
92 {
93 return std::make_shared<Button>();
94 }
95
96 inline std::shared_ptr<Checkbox> makeCheckbox()
97 {
98 return std::make_shared<Checkbox>();
99 }
100
101 inline std::shared_ptr<QRCheckbox> makeQRCheckbox()
102 {
103 return std::make_shared<QRCheckbox>();
104 }
105
106 inline std::shared_ptr<DropDownList> makeDropDownList()
107 {
108 return std::make_shared<DropDownList>();
109 }
110
111 inline std::shared_ptr<Label> makeLabel()
112 {
113 return std::make_shared<Label>();
114 }
115
116 inline std::shared_ptr<List> makeList()
117 {
118 return std::make_shared<List>();
119 }
120
121 inline std::shared_ptr<Separator> makeHSeparator()
122 {
123 return std::make_shared<Separator>(false);
124 }
125
126 inline std::shared_ptr<Separator> makeVSeparator()
127 {
128 return std::make_shared<Separator>(true);
129 }
130
131 inline std::shared_ptr<TextField> makeTextField()
132 {
133 return std::make_shared<TextField>();
134 }
135
136 inline std::shared_ptr<ColorSel> makeColorSel()
137 {
138 return std::make_shared<ColorSel>();
139 }
140
141 inline std::shared_ptr<Slider> makeSlider()
142 {
143 return std::make_shared<Slider>();
144 }
145
146 inline std::shared_ptr<DitherPreview> makeDitherPreview()
147 {
148 return std::make_shared<DitherPreview>();
149 }
150
151 // Containers
152
153 inline std::shared_ptr<Frame> makeFrame()
154 {
155 return std::make_shared<Frame>();
156 }
157
158 // This is counterintuitive: Multiple rows=rows, one row=columns.
159 inline std::shared_ptr<Grid> makeColumn()
160 {
161 return Grid::rows(1);
162 }
163
164 inline std::shared_ptr<Grid> makeColumns(size_t size)
165 {
166 return Grid::columns(size);
167 }
168
169 inline std::shared_ptr<Grid> makeRow()
170 {
171 return Grid::columns(1);
172 }
173
174 inline std::shared_ptr<Grid> makeRows(size_t size)
175 {
176 return Grid::rows(size);
177 }
178
179 inline std::shared_ptr<Grid> makeRowsColumns(size_t size, size_t size2)
180 {
181 return Grid::rows_columns(size, size2);
182 }
183
184 inline std::shared_ptr<Grid> makeColumnsRows(size_t size, size_t size2)
185 {
186 return Grid::columns_rows(size, size2);
187 }
188
189 inline std::shared_ptr<ScrollingPane> makeScrollingPane()
190 {
191 return std::make_shared<ScrollingPane>();
192 }
193
194 inline std::shared_ptr<Switcher> makeSwitcher()
195 {
196 return std::make_shared<Switcher>();
197 }
198
199 inline std::shared_ptr<Menu> makeMenu()
200 {
201 return std::make_shared<Menu>();
202 }
203
204 inline std::shared_ptr<TabPanel> makeTabPanel()
205 {
206 return std::make_shared<TabPanel>();
207 }
208
209 inline std::shared_ptr<QRPanel> makeQRPanel()
210 {
211 return std::make_shared<QRPanel>();
212 }
213
214 inline std::shared_ptr<DDPanel> makeDDPanel()
215 {
216 return std::make_shared<DDPanel>();
217 }
218
219 inline std::shared_ptr<TabRef> makeTabRef()
220 {
221 return std::make_shared<TabRef>();
222 }
223
224 inline std::shared_ptr<Radio> makeRadio()
225 {
226 return std::make_shared<Radio>();
227 }
228
229 inline std::shared_ptr<RadioSet> makeRadioSet()
230 {
231 return std::make_shared<RadioSet>();
232 }
233
234 inline std::shared_ptr<DummyWidget> makeDummyWidget()
235 {
236 return std::make_shared<DummyWidget>();
237 }
238
239 #ifdef IS_EDITOR
240 inline std::shared_ptr<SelTileSwatch> makeSelTileSwatch()
241 {
242 return std::make_shared<SelTileSwatch>();
243 }
244
245 inline std::shared_ptr<SelComboSwatch> makeSelComboSwatch()
246 {
247 return std::make_shared<SelComboSwatch>();
248 }
249
250 inline std::shared_ptr<CornerSwatch> makeCornerSwatch()
251 {
252 return std::make_shared<CornerSwatch>();
253 }
254
255 inline std::shared_ptr<SelHeroTileSwatch> makeSelHeroTileSwatch()
256 {
257 return std::make_shared<SelHeroTileSwatch>();
258 }
259
260 inline std::shared_ptr<TileFrame> makeTileFrame()
261 {
262 return std::make_shared<TileFrame>();
263 }
264
265 inline std::shared_ptr<PaletteFrame> makePaletteFrame()
266 {
267 return std::make_shared<PaletteFrame>();
268 }
269
270 inline std::shared_ptr<MsgPreview> makeMsgPreview()
271 {
272 return std::make_shared<MsgPreview>();
273 }
274
275 inline std::shared_ptr<MiscCSetSel> makeMiscCSetSel()
276 {
277 return std::make_shared<MiscCSetSel>();
278 }
279
280 inline std::shared_ptr<MiscColorSel> makeMiscColorSel()
281 {
282 return std::make_shared<MiscColorSel>();
283 }
284
285 inline std::shared_ptr<MiscColorRow> makeMiscColorRow()
286 {
287 return std::make_shared<MiscColorRow>();
288 }
289
290 inline std::shared_ptr<DMapMinimap> makeDMapMinimap()
291 {
292 return std::make_shared<DMapMinimap>();
293 }
294
295 inline std::shared_ptr<DMapMapGrid> makeDMapMapGrid()
296 {
297 return std::make_shared<DMapMapGrid>();
298 }
299
300 inline std::shared_ptr<DMapFrame> makeDMapFrame()
301 {
302 return std::make_shared<DMapFrame>();
303 }
304
305 inline std::shared_ptr<Engraving> makeEngraving()
306 {
307 return std::make_shared<Engraving>();
308 }
309
310 inline std::shared_ptr<RegionGrid> makeRegionGrid()
311 {
312 return std::make_shared<RegionGrid>();
313 }
314 #endif
315
316 // Top-level widgets
317
318 inline std::shared_ptr<Window> makeWindow()
319 {
320 return std::make_shared<Window>();
321 }
322
323 } // namespace GUI::Internal
324
325 namespace GUI::Builder
326 {
327
328 ZCGUI_BUILDER_START(Button)
329 ZCGUI_ACCEPT_PROP(onClick, onClick, Dialog::message)
330 ZCGUI_ACCEPT_PROP(text, setText, std::string)
331 ZCGUI_ACCEPT_PROP(onPressFunc, setOnPress, std::function<void()>)
332 ZCGUI_ACCEPT_PROP(type, setType, Button::type)
333 ZCGUI_ACCEPT_PROP(kb_ptr, setBoundKB, int*)
334 ZCGUI_ACCEPT_PROP(hotkey_ptr, setBoundHotkey, Hotkey*)
335 ZCGUI_ACCEPT_PROP(hotkey_indx, setHotkeyIndx, size_t)
336 ZCGUI_ACCEPT_PROP(stick_index_ptr, setBoundStickIndex, int*)
337 ZCGUI_ACCEPT_PROP(bind_name, setBindName, std::string)
338 ZCGUI_ACCEPT_PROP(icon, setIcon, int)
339
340 ZCGUI_SUGGEST_PROP(title, text)
341 ZCGUI_SUGGEST_PROP(onEnter, onClick)
342 ZCGUI_BUILDER_END()
343 ZCGUI_BUILDER_FUNCTION(Button, Button, makeButton)
344
345
346 ZCGUI_BUILDER_START(Checkbox)
347 ZCGUI_ACCEPT_PROP(checked, setChecked, bool)
348 ZCGUI_ACCEPT_PROP(text, setText, std::string)
349 ZCGUI_ACCEPT_PROP(boxPlacement, setBoxPlacement, Checkbox::boxPlacement)
350 ZCGUI_ACCEPT_PROP(onToggle, onToggle, Dialog::message)
351 ZCGUI_ACCEPT_PROP(onToggleFunc, setOnToggleFunc, std::function<void(bool)>)
352
353 ZCGUI_SUGGEST_PROP(title, text)
354 ZCGUI_BUILDER_END()
355 ZCGUI_BUILDER_FUNCTION(Checkbox, Checkbox, makeCheckbox)
356
357 ZCGUI_BUILDER_START(Radio)
358 ZCGUI_ACCEPT_PROP(checked, setChecked, bool)
359 ZCGUI_ACCEPT_PROP(text, setText, std::string)
360 ZCGUI_ACCEPT_PROP(set, setProcSet, int32_t)
361 ZCGUI_ACCEPT_PROP(indx, setIndex, size_t)
362 ZCGUI_ACCEPT_PROP(onToggle, onToggle, Dialog::message)
363 ZCGUI_ACCEPT_PROP(onPressFunc, setOnPressFunc, std::function<void(size_t)>)
364
365 ZCGUI_SUGGEST_PROP(title, text)
366 ZCGUI_BUILDER_END()
367 ZCGUI_BUILDER_FUNCTION(Radio, Radio, makeRadio)
368
369
370 ZCGUI_BUILDER_START(RadioSet)
371 ZCGUI_ACCEPT_PROP(checked, setChecked, int32_t)
372 ZCGUI_ACCEPT_PROP(set, setProcSet, int32_t)
373 ZCGUI_ACCEPT_PROP(onToggle, onToggle, Dialog::message)
374
375 ZCGUI_ACCEPT_PROP(data, loadList, const ::GUI::ListData&)
376 ZCGUI_BUILDER_END()
377 ZCGUI_BUILDER_FUNCTION(RadioSet, RadioSet, makeRadioSet)
378
379
380 ZCGUI_BUILDER_START(DropDownList)
381 ZCGUI_ACCEPT_PROP(data, setListData, const ::GUI::ListData&)
382 ZCGUI_ACCEPT_PROP(selectedValue, setSelectedValue, int32_t)
383 ZCGUI_ACCEPT_PROP(onSelectionChanged, onSelectionChanged, Dialog::message)
384 ZCGUI_ACCEPT_PROP(onSelectFunc, setOnSelectFunc, std::function<void(int32_t)>)
385
386 ZCGUI_SUGGEST_PROP(onClick, onSelectionChanged)
387 ZCGUI_BUILDER_END()
388 ZCGUI_BUILDER_FUNCTION(DropDownList, DropDownList, makeDropDownList)
389
390
391 ZCGUI_BUILDER_START(Frame)
392 ZCGUI_ACCEPT_PROP(title, setTitle, std::string)
393 ZCGUI_ACCEPT_PROP(info, setInfo, std::string)
394 ZCGUI_ACCEPT_PROP(style, setStyle, GUI::Frame::style)
395 ZCGUI_ACCEPT_PROP(onInfo, onInfo, Dialog::message)
396 ZCGUI_ACCEPT_ONE_CHILD(setContent)
397
398 ZCGUI_SUGGEST_PROP(text, title)
399 ZCGUI_BUILDER_END()
400 ZCGUI_BUILDER_FUNCTION(Frame, Frame, makeFrame)
401
402
403 ZCGUI_BUILDER_START(Label)
404 ZCGUI_ACCEPT_PROP(text, setText, std::string)
405 ZCGUI_ACCEPT_PROP(maxLines, setMaxLines, std::size_t)
406 ZCGUI_ACCEPT_PROP(textAlign, setAlign, int32_t)
407 ZCGUI_ACCEPT_PROP(noHLine, setNoHLine, bool)
408
409 ZCGUI_SUGGEST_PROP(title, text)
410 ZCGUI_BUILDER_END()
411 ZCGUI_BUILDER_FUNCTION(Label, Label, makeLabel)
412
413
414 ZCGUI_BUILDER_START(List)
415 ZCGUI_ACCEPT_PROP(data, setListData, GUI::ListData)
416 ZCGUI_ACCEPT_PROP(selectedValue, setSelectedValue, int32_t)
417 ZCGUI_ACCEPT_PROP(selectedIndex, setSelectedIndex, int32_t)
418 ZCGUI_ACCEPT_PROP(onSelectionChanged, onSelectionChanged, Dialog::message)
419 ZCGUI_ACCEPT_PROP(onRClick, onRClick, Dialog::message)
420 ZCGUI_ACCEPT_PROP(onDClick, onDClick, Dialog::message)
421 ZCGUI_ACCEPT_PROP(onRClickFunc, setOnRClickFunc, std::function<void(int32_t,int32_t,int32_t)>)
422 ZCGUI_ACCEPT_PROP(onDClickFunc, setOnDClickFunc, std::function<void(int32_t,int32_t,int32_t)>)
423 ZCGUI_ACCEPT_PROP(onSelectFunc, setOnSelectFunc, std::function<void(int32_t)>)
424 ZCGUI_ACCEPT_PROP(isABC, setIsABC, bool)
425
426 ZCGUI_SUGGEST_PROP(onClick, onSelectionChanged)
427 ZCGUI_BUILDER_END()
428 ZCGUI_BUILDER_FUNCTION(List, List, makeList)
429
430
431 ZCGUI_BUILDER_START(Separator)
432 ZCGUI_ACCEPT_PROP(color_1, setColor1, byte)
433 ZCGUI_ACCEPT_PROP(color_2, setColor2, byte)
434 ZCGUI_BUILDER_END()
435 ZCGUI_BUILDER_FUNCTION(Separator, HSeparator, makeHSeparator)
436 ZCGUI_BUILDER_FUNCTION(Separator, VSeparator, makeVSeparator)
437
438 ZCGUI_BUILDER_START(Grid)
439 ZCGUI_ACCEPT_PROP(columnSpacing, setColumnSpacing, ::GUI::Size)
440 ZCGUI_ACCEPT_PROP(rowSpacing, setRowSpacing, ::GUI::Size)
441 ZCGUI_ACCEPT_PROP(spacing, setSpacing, ::GUI::Size)
442
443 ZCGUI_ACCEPT_MULTIPLE_CHILDREN(add)
444 ZCGUI_BUILDER_END()
445 ZCGUI_BUILDER_FUNCTION(Grid, Row, makeRow)
446 ZCGUI_BUILDER_FUNCTION_TEMPLATE(Grid, Rows, makeRows, std::size_t)
447 ZCGUI_BUILDER_FUNCTION(Grid, Column, makeColumn)
448 ZCGUI_BUILDER_FUNCTION_TEMPLATE(Grid, Columns, makeColumns, std::size_t)
449 ZCGUI_BUILDER_FUNCTION_TEMPLATE2(Grid, Rows_Columns, makeRowsColumns, std::size_t, std::size_t)
450 ZCGUI_BUILDER_FUNCTION_TEMPLATE2(Grid, Columns_Rows, makeColumnsRows, std::size_t, std::size_t)
451
452
453 ZCGUI_BUILDER_START(ScrollingPane)
454 ZCGUI_ACCEPT_PROP(ptr_x, setPtrX, int32_t*)
455 ZCGUI_ACCEPT_PROP(ptr_y, setPtrY, int32_t*)
456 ZCGUI_ACCEPT_PROP(targWidth, setTargWidth, ::GUI::Size)
457 ZCGUI_ACCEPT_PROP(targHeight, setTargHeight, ::GUI::Size)
458 ZCGUI_ACCEPT_PROP(mode, setMode, ScrollingPane::Mode)
459 ZCGUI_ACCEPT_ONE_CHILD(setContent)
460 ZCGUI_BUILDER_END()
461 ZCGUI_BUILDER_FUNCTION(ScrollingPane, ScrollingPane, makeScrollingPane)
462
463
464 ZCGUI_BUILDER_START(Switcher)
465 ZCGUI_ACCEPT_MULTIPLE_CHILDREN(add)
466 ZCGUI_BUILDER_END()
467 ZCGUI_BUILDER_FUNCTION(Switcher, Switcher, makeSwitcher)
468
469 ZCGUI_BUILDER_START(Menu)
470 ZCGUI_ACCEPT_PROP(menu, setMenu, GuiMenu*)
471 ZCGUI_BUILDER_END()
472 ZCGUI_BUILDER_FUNCTION(Menu, Menu, makeMenu)
473
474 ZCGUI_BUILDER_START(TabPanel)
475 ZCGUI_ACCEPT_PROP(indx, switchTo, size_t)
476 ZCGUI_ACCEPT_PROP(ptr, setPtr, size_t*)
477 ZCGUI_ACCEPT_PROP(onSwitch, setOnSwitch, std::function<void(size_t,size_t)>)
478 ZCGUI_ACCEPT_MULTIPLE_CHILDREN(add)
479 ZCGUI_BUILDER_END()
480 ZCGUI_BUILDER_FUNCTION(TabPanel, TabPanel, makeTabPanel)
481
482 ZCGUI_BUILDER_START(QRPanel)
483 ZCGUI_ACCEPT_PROP(onToggle, onToggle, Dialog::message)
484 ZCGUI_ACCEPT_PROP(onCloseInfo, onCloseInfo, Dialog::message)
485 ZCGUI_ACCEPT_PROP(qr_ptr, loadQRs, byte*)
486 ZCGUI_ACCEPT_PROP(ptr, setPtr, size_t*)
487 ZCGUI_ACCEPT_PROP(count, setCount, size_t)
488 ZCGUI_ACCEPT_PROP(showtags, setShowTags, bool)
489 ZCGUI_ACCEPT_PROP(indexed, setIndexed, bool)
490 ZCGUI_ACCEPT_PROP(scrollWidth, setScrollWidth, ::GUI::Size)
491 ZCGUI_ACCEPT_PROP(scrollHeight, setScrollHeight, ::GUI::Size)
492 ZCGUI_ACCEPT_PROP(data, loadList, const ::GUI::ListData&)
493 ZCGUI_BUILDER_END()
494 ZCGUI_BUILDER_FUNCTION(QRPanel, QRPanel, makeQRPanel)
495
496 ZCGUI_BUILDER_START(DDPanel)
497 ZCGUI_ACCEPT_PROP(onSelectionChanged, onSelectionChanged, Dialog::message)
498 ZCGUI_ACCEPT_PROP(values, linkVals, int32_t*)
499 ZCGUI_ACCEPT_PROP(count, setCount, size_t)
500 ZCGUI_ACCEPT_PROP(ddlist, loadDDList, const ::GUI::ListData&)
501 ZCGUI_ACCEPT_PROP(data, loadList, const ::GUI::ListData&)
502 ZCGUI_BUILDER_END()
503 ZCGUI_BUILDER_FUNCTION(DDPanel, DDPanel, makeDDPanel)
504
505 ZCGUI_BUILDER_START(TabRef)
506 ZCGUI_ACCEPT_PROP(name, setName, std::string)
507 ZCGUI_ACCEPT_ONE_CHILD(setContent)
508 ZCGUI_BUILDER_END()
509 ZCGUI_BUILDER_FUNCTION(TabRef, TabRef, makeTabRef)
510
511 ZCGUI_BUILDER_START(TextField)
512 ZCGUI_ACCEPT_PROP(maxLength, setMaxLength, std::size_t);
513 ZCGUI_ACCEPT_PROP(onEnter, onEnter, Dialog::message)
514 ZCGUI_ACCEPT_PROP(onValueChanged, onValueChanged, Dialog::message)
515 ZCGUI_ACCEPT_PROP(text, setText, std::string_view)
516 ZCGUI_ACCEPT_PROP(val, setVal, int32_t)
517 ZCGUI_ACCEPT_PROP(type, setType, TextField::type)
518 ZCGUI_ACCEPT_PROP(low, setLowBound, int32_t)
519 ZCGUI_ACCEPT_PROP(high, setHighBound, int32_t)
520 ZCGUI_ACCEPT_PROP(onValChangedFunc, setOnValChanged, std::function<void(TextField::type,std::string_view,int32_t)>)
521 ZCGUI_ACCEPT_PROP(onCursorChangedFunc, setOnCursorChanged, std::function<void(TextField::type,int32_t,int32_t)>)
522 ZCGUI_ACCEPT_PROP(places, setFixedPlaces, size_t)
523 ZCGUI_ACCEPT_PROP(swap_type, setSwapType, int32_t)
524 ZCGUI_BUILDER_END()
525 ZCGUI_BUILDER_FUNCTION(TextField, TextField, makeTextField)
526
527 ZCGUI_BUILDER_START(ColorSel)
528 ZCGUI_ACCEPT_PROP(onValueChanged, onValueChanged, Dialog::message)
529 ZCGUI_ACCEPT_PROP(val, setVal, byte)
530 ZCGUI_ACCEPT_PROP(onValChangedFunc, setOnValChanged, std::function<void(byte)>)
531 ZCGUI_BUILDER_END()
532 ZCGUI_BUILDER_FUNCTION(ColorSel, ColorSel, makeColorSel)
533
534 ZCGUI_BUILDER_START(Slider)
535 ZCGUI_ACCEPT_PROP(onValueChanged, onValueChanged, Dialog::message)
536 ZCGUI_ACCEPT_PROP(value, setValue, int32_t)
537 ZCGUI_ACCEPT_PROP(min_value, setMinValue, int32_t)
538 ZCGUI_ACCEPT_PROP(max_value, setMaxValue, int32_t)
539 ZCGUI_ACCEPT_PROP(step, setStep, int32_t)
540 ZCGUI_ACCEPT_PROP(handle_width, setHandleWidth, ::GUI::Size)
541 ZCGUI_ACCEPT_PROP(bar_width, setBarWidth, ::GUI::Size)
542 ZCGUI_ACCEPT_PROP(onValChangedFunc, setOnValChanged, std::function<void(int32_t)>)
543 ZCGUI_BUILDER_END()
544 ZCGUI_BUILDER_FUNCTION(Slider, Slider, makeSlider)
545
546 ZCGUI_BUILDER_START(DitherPreview)
547 ZCGUI_ACCEPT_PROP(dither_type, setDitherType, byte)
548 ZCGUI_ACCEPT_PROP(dither_arg, setDitherArg, byte)
549 ZCGUI_ACCEPT_PROP(dither_color, setDitherColor, byte)
550 ZCGUI_ACCEPT_PROP(preview_scale, setPreviewScale, byte)
551 ZCGUI_BUILDER_END()
552 ZCGUI_BUILDER_FUNCTION(DitherPreview, DitherPreview, makeDitherPreview)
553
554 ZCGUI_BUILDER_START(Window)
555 ZCGUI_ACCEPT_PROP(title, setTitle, std::string)
556 ZCGUI_ACCEPT_PROP(info, setHelp, std::string)
557 ZCGUI_ACCEPT_PROP(menu, setMenu, std::shared_ptr<Menu>)
558 ZCGUI_ACCEPT_PROP(onClose, onClose, Dialog::message)
559 ZCGUI_ACCEPT_PROP(onEnter, onEnter, Dialog::message)
560 ZCGUI_ACCEPT_PROP(use_vsync, setVSync, bool)
561 ZCGUI_ACCEPT_PROP(shortcuts, addShortcuts,
562 std::initializer_list<KeyboardShortcut>)
563 ZCGUI_ACCEPT_PROP(onTick, setOnTick, std::function<int32_t()>)
564 ZCGUI_ACCEPT_PROP(onLoad, setOnLoad, std::function<void()>)
565 ZCGUI_ACCEPT_ONE_CHILD(setContent)
566
567 ZCGUI_SUGGEST_PROP(text, title)
568 ZCGUI_BUILDER_END()
569 ZCGUI_BUILDER_FUNCTION(Window, Window, makeWindow)
570
571 ZCGUI_BUILDER_START(DummyWidget)
572 ZCGUI_BUILDER_END()
573 ZCGUI_BUILDER_FUNCTION(DummyWidget, DummyWidget, makeDummyWidget)
574
575 #ifdef IS_EDITOR
576 ZCGUI_BUILDER_START(SelTileSwatch)
577 ZCGUI_ACCEPT_PROP(tile, setTile, int32_t)
578 ZCGUI_ACCEPT_PROP(cset, setCSet, int32_t)
579 ZCGUI_ACCEPT_PROP(flip, setFlip, int32_t)
580 ZCGUI_ACCEPT_PROP(showFlip, setShowFlip, bool)
581 ZCGUI_ACCEPT_PROP(showvals, setShowVals, bool)
582 ZCGUI_ACCEPT_PROP(mini, setIsMini, bool)
583 ZCGUI_ACCEPT_PROP(showT0, setShowT0, bool)
584 ZCGUI_ACCEPT_PROP(minicorner, setMiniCrn, int32_t)
585 ZCGUI_ACCEPT_PROP(tilewid, setTileWid, int32_t)
586 ZCGUI_ACCEPT_PROP(tilehei, setTileHei, int32_t)
587 ZCGUI_ACCEPT_PROP(deftile, setDefTile, int32_t)
588 ZCGUI_ACCEPT_PROP(defcs, setDefCS, int32_t)
589 ZCGUI_ACCEPT_PROP(minionly, setMiniOnly, bool)
590 ZCGUI_ACCEPT_PROP(onSelectionChanged, onSelectionChanged, Dialog::message)
591 ZCGUI_ACCEPT_PROP(onSelectFunc, setOnSelectFunc, std::function<void(int32_t,int32_t,int32_t)>)
592 ZCGUI_BUILDER_END()
593 ZCGUI_BUILDER_FUNCTION(SelTileSwatch, SelTileSwatch, makeSelTileSwatch)
594
595 ZCGUI_BUILDER_START(SelComboSwatch)
596 ZCGUI_ACCEPT_PROP(combo, setCombo, int32_t)
597 ZCGUI_ACCEPT_PROP(cset, setCSet, int32_t)
598 ZCGUI_ACCEPT_PROP(showvals, setShowVals, bool)
599 ZCGUI_ACCEPT_PROP(onSelectionChanged, onSelectionChanged, Dialog::message)
600 ZCGUI_ACCEPT_PROP(onSelectFunc, setOnSelectFunc, std::function<void(int32_t,int32_t)>)
601 ZCGUI_BUILDER_END()
602 ZCGUI_BUILDER_FUNCTION(SelComboSwatch, SelComboSwatch, makeSelComboSwatch)
603
604 ZCGUI_BUILDER_START(CornerSwatch)
605 ZCGUI_ACCEPT_PROP(val, setVal, int32_t)
606 ZCGUI_ACCEPT_PROP(color, setColor, int32_t)
607 ZCGUI_ACCEPT_PROP(onSelectionChanged, onSelectionChanged, Dialog::message)
608 ZCGUI_ACCEPT_PROP(onSelectFunc, setOnSelectFunc, std::function<void(int32_t)>)
609 ZCGUI_BUILDER_END()
610 ZCGUI_BUILDER_FUNCTION(CornerSwatch, CornerSwatch, makeCornerSwatch)
611
612 ZCGUI_BUILDER_START(SelHeroTileSwatch)
613 ZCGUI_ACCEPT_PROP(heroSprite, setHeroSprite, int32_t)
614 ZCGUI_ACCEPT_PROP(dir, setDir, int32_t)
615 ZCGUI_ACCEPT_PROP(frames, setFrames, int32_t)
616 ZCGUI_BUILDER_END()
617 ZCGUI_BUILDER_FUNCTION(SelHeroTileSwatch, SelHeroTileSwatch, makeSelHeroTileSwatch)
618
619 ZCGUI_BUILDER_START(TileFrame)
620 ZCGUI_ACCEPT_PROP(tile, setTile, int32_t)
621 ZCGUI_ACCEPT_PROP(cset, setCSet, int32_t)
622 ZCGUI_ACCEPT_PROP(cset2, setCSet2, int32_t)
623 ZCGUI_ACCEPT_PROP(speed, setSpeed, int32_t)
624 ZCGUI_ACCEPT_PROP(frames, setFrames, int32_t)
625 ZCGUI_ACCEPT_PROP(delay, setDelay, int32_t)
626 ZCGUI_ACCEPT_PROP(skipx, setSkipX, int32_t)
627 ZCGUI_ACCEPT_PROP(skipy, setSkipY, int32_t)
628 ZCGUI_ACCEPT_PROP(tilewid, setTileW, int32_t)
629 ZCGUI_ACCEPT_PROP(tilehei, setTileH, int32_t)
630 ZCGUI_ACCEPT_PROP(do_sized, setDoSized, bool)
631 ZCGUI_ACCEPT_PROP(flip, setFlip, int32_t)
632 ZCGUI_ACCEPT_PROP(flashcs, setFlashCS, int32_t)
633 ZCGUI_BUILDER_END()
634 ZCGUI_BUILDER_FUNCTION(TileFrame, TileFrame, makeTileFrame)
635
636 ZCGUI_BUILDER_START(PaletteFrame)
637 ZCGUI_ACCEPT_PROP(bitmap, setBitmap, BITMAP*)
638 ZCGUI_ACCEPT_PROP(cdata, setColorData, byte*)
639 ZCGUI_ACCEPT_PROP(palette, setPal, PALETTE*)
640 ZCGUI_ACCEPT_PROP(count, setCount, uint8_t)
641 ZCGUI_ACCEPT_PROP(onUpdate, setOnUpdate, std::function<void()>)
642 ZCGUI_BUILDER_END()
643 ZCGUI_BUILDER_FUNCTION(PaletteFrame, PaletteFrame, makePaletteFrame)
644
645 ZCGUI_BUILDER_START(MsgPreview)
646 ZCGUI_ACCEPT_PROP(data, setData, MsgStr const*)
647 ZCGUI_ACCEPT_PROP(indx, setIndex, int32_t)
648 ZCGUI_ACCEPT_PROP(text, setText, std::string)
649 ZCGUI_BUILDER_END()
650 ZCGUI_BUILDER_FUNCTION(MsgPreview, MsgPreview, makeMsgPreview)
651
652 ZCGUI_BUILDER_START(MiscCSetSel)
653 ZCGUI_ACCEPT_PROP(c1, setC1, int32_t)
654 ZCGUI_ACCEPT_PROP(c2, setC2, int32_t)
655 ZCGUI_ACCEPT_PROP(onUpdate, setOnUpdate, std::function<void(int32_t,int32_t)>)
656 ZCGUI_BUILDER_END()
657 ZCGUI_BUILDER_FUNCTION(MiscCSetSel, MiscCSetSel, makeMiscCSetSel)
658
659 ZCGUI_BUILDER_START(MiscColorSel)
660 ZCGUI_ACCEPT_PROP(c1, setC1, int32_t)
661 ZCGUI_ACCEPT_PROP(c2, setC2, int32_t)
662 ZCGUI_ACCEPT_PROP(onUpdate, setOnUpdate, std::function<void(int32_t,int32_t)>)
663 ZCGUI_BUILDER_END()
664 ZCGUI_BUILDER_FUNCTION(MiscColorSel, MiscColorSel, makeMiscColorSel)
665
666 ZCGUI_BUILDER_START(MiscColorRow)
667 ZCGUI_ACCEPT_PROP(system, setSys, bool)
668 ZCGUI_ACCEPT_PROP(val, setVal, int32_t)
669 ZCGUI_ACCEPT_PROP(cset, setCS, int32_t)
670 ZCGUI_ACCEPT_PROP(onUpdate, setOnUpdate, std::function<void(int32_t)>)
671 ZCGUI_BUILDER_END()
672 ZCGUI_BUILDER_FUNCTION(MiscColorRow, MiscColorRow, makeMiscColorRow)
673
674 ZCGUI_BUILDER_START(DMapMinimap)
675 ZCGUI_ACCEPT_PROP(curMap, setCurMap, int32_t)
676 ZCGUI_ACCEPT_PROP(smallDMap, setSmallDMap, bool)
677 ZCGUI_ACCEPT_PROP(offset, setOffset, int32_t)
678 ZCGUI_BUILDER_END()
679 ZCGUI_BUILDER_FUNCTION(DMapMinimap, DMapMinimap, makeDMapMinimap)
680
681 ZCGUI_BUILDER_START(DMapMapGrid)
682 ZCGUI_ACCEPT_PROP(mapGridPtr, setMapGridPtr, byte*)
683 ZCGUI_ACCEPT_PROP(continueScreen, setContinueScreen, int32_t)
684 ZCGUI_ACCEPT_PROP(compassScreen, setCompassScreen, bool)
685 ZCGUI_ACCEPT_PROP(smallDMap, setSmallDMap, bool)
686 ZCGUI_ACCEPT_PROP(onUpdate, setOnUpdate, std::function<void(byte*, byte, byte)>)
687 ZCGUI_BUILDER_END()
688 ZCGUI_BUILDER_FUNCTION(DMapMapGrid, DMapMapGrid, makeDMapMapGrid)
689
690 ZCGUI_BUILDER_START(DMapFrame)
691 ZCGUI_ACCEPT_PROP(Dmap, setDMap, int32_t)
692 ZCGUI_BUILDER_END()
693 ZCGUI_BUILDER_FUNCTION(DMapFrame, DMapFrame, makeDMapFrame)
694
695 ZCGUI_BUILDER_START(RegionGrid)
696 ZCGUI_ACCEPT_PROP(localRegionsData, setLocalRegionsData, regions_data*)
697 ZCGUI_ACCEPT_PROP(onUpdate, setOnUpdate, std::function<void()>)
698 ZCGUI_BUILDER_END()
699 ZCGUI_BUILDER_FUNCTION(RegionGrid, RegionGrid, makeRegionGrid)
700
701 ZCGUI_BUILDER_START(Engraving)
702 ZCGUI_ACCEPT_PROP(data, setSlot, int32_t)
703 ZCGUI_BUILDER_END()
704 ZCGUI_BUILDER_FUNCTION(Engraving, Engraving, makeEngraving)
705
706 #endif
707
708 } // namespace GUI::builder
709
710 namespace GUI::Props
711 {
712
713 // We want these in scope for setting sizes.
714 using ::GUI::operator ""_em;
715 using ::GUI::operator ""_px;
716
717 } // namespace GUI::Props
718
719 //{ Builder Shortcuts
720 #define _d DummyWidget()
721
722 //
723
724 #define INITD_ROW(ind, d_mem, lab_mem) \
725 Row(vPadding = 0_px, \
726 TextField(maxLength = 64, \
727 text = std::string(lab_mem[ind]), \
728 type = GUI::TextField::type::TEXT, \
729 width = 8_em, \
730 rightPadding = 0_px, \
731 onValChangedFunc = [&](GUI::TextField::type,std::string_view str,int32_t) \
732 { \
733 for(size_t q = 0; q < 65; ++q) \
734 { \
735 if(q < str.size()) \
736 lab_mem[ind][q] = str.at(q); \
737 else \
738 lab_mem[ind][q] = 0; \
739 } \
740 } \
741 ), \
742 TextField( \
743 type = GUI::TextField::type::SWAP_ZSINT, \
744 val = d_mem[ind], \
745 width = 6.5_em+16_px, \
746 leftPadding = 0_px, \
747 onValChangedFunc = [&](GUI::TextField::type,std::string_view,int32_t val) \
748 { \
749 d_mem[ind] = val; \
750 } \
751 ) \
752 )
753
754 #define INITD_ROW2(ind, d_mem) \
755 Row(vPadding = 0_px, \
756 Label( text = "InitD["+std::to_string(ind)+"]:", \
757 textAlign = 2, \
758 rightPadding = 0_px \
759 ), \
760 TextField( \
761 type = GUI::TextField::type::SWAP_ZSINT, \
762 val = d_mem[ind], \
763 width = 6.5_em+16_px, \
764 leftPadding = 0_px, \
765 onValChangedFunc = [&](GUI::TextField::type,std::string_view,int32_t val) \
766 { \
767 d_mem[ind] = val; \
768 } \
769 ) \
770 )
771
772 #define SCRIPT_LIST(name, list, mem) \
773 Label(minwidth = 6.5_em, text = name, textAlign = 2), \
774 DropDownList( \
775 fitParent = true, \
776 data = list, \
777 selectedValue = mem, \
778 onSelectFunc = [&](int32_t val) \
779 { \
780 mem = val; \
781 } \
782 )
783
784 #define SCRIPT_LIST_PROC(name, list, mem, proc) \
785 Label(minwidth = 6.5_em, text = name, textAlign = 2), \
786 DropDownList( \
787 fitParent = true, \
788 data = list, \
789 selectedValue = mem, \
790 onSelectFunc = [&](int32_t val) \
791 { \
792 mem = val; \
793 proc(); \
794 } \
795 )
796
797 //
798
799 #define DINFOBTN() \
800 Button(forceFitH = true, text = "?", \
801 disabled = true)
802 #define INFOBTN(inf) \
803 Button(forceFitH = true, text = "?", \
804 onClick = message::REFR_INFO, \
805 onPressFunc = [=]() \
806 { \
807 displayinfo("Info",inf); \
808 })
809 #define INFOBTN_VS(inf, vs) \
810 Button(forceFitH = true, text = "?", \
811 vPadding = vs, \
812 onClick = message::REFR_INFO, \
813 onPressFunc = [=]() \
814 { \
815 displayinfo("Info",inf); \
816 })
817 #define INFOBTN_T(title, inf) \
818 Button(forceFitH = true, text = "?", \
819 onClick = message::REFR_INFO, \
820 onPressFunc = [=]() \
821 { \
822 displayinfo(title,inf); \
823 })
824 #define INFOBTN_F(inf,...) \
825 Button(forceFitH = true, text = "?", \
826 onClick = message::REFR_INFO, \
827 onPressFunc = [=]() \
828 { \
829 displayinfo("Info",fmt::format(inf,__VA_ARGS__)); \
830 })
831 #define INFOBTN_EX(inf, ...) \
832 Button(text = "?", \
833 onClick = message::REFR_INFO, \
834 __VA_ARGS__, \
835 onPressFunc = [=]() \
836 { \
837 displayinfo("Info",inf); \
838 })
839 #define INFOBTN_REF(getter) \
840 Button(forceFitH = true, text = "?", \
841 onClick = message::REFR_INFO, \
842 onPressFunc = [&]() \
843 { \
844 displayinfo("Info",getter); \
845 })
846
847 //
848
849 #define _INTBTN_PANEL_HELPER(var) \
850 Columns<4>( \
851 Checkbox( \
852 text = "A", hAlign = 0.0, \
853 checked = var&0x1, \
854 onToggleFunc = [&](bool state) \
855 { \
856 SETFLAG(var,0x1,state); \
857 }), \
858 Checkbox( \
859 text = "B", hAlign = 0.0, \
860 checked = var&0x2, \
861 onToggleFunc = [&](bool state) \
862 { \
863 SETFLAG(var,0x2,state); \
864 }), \
865 Checkbox( \
866 text = "L", hAlign = 0.0, \
867 checked = var&0x4, \
868 onToggleFunc = [&](bool state) \
869 { \
870 SETFLAG(var,0x4,state); \
871 }), \
872 Checkbox( \
873 text = "R", hAlign = 0.0, \
874 checked = var&0x8, \
875 onToggleFunc = [&](bool state) \
876 { \
877 SETFLAG(var,0x8,state); \
878 }), \
879 Checkbox( \
880 text = "Ex1", hAlign = 0.0, \
881 checked = var&0x10, \
882 onToggleFunc = [&](bool state) \
883 { \
884 SETFLAG(var,0x10,state); \
885 }), \
886 Checkbox( \
887 text = "Ex2", hAlign = 0.0, \
888 checked = var&0x20, \
889 onToggleFunc = [&](bool state) \
890 { \
891 SETFLAG(var,0x20,state); \
892 }), \
893 Checkbox( \
894 text = "Ex3", hAlign = 0.0, \
895 checked = var&0x40, \
896 onToggleFunc = [&](bool state) \
897 { \
898 SETFLAG(var,0x40,state); \
899 }), \
900 Checkbox( \
901 text = "Ex4", hAlign = 0.0, \
902 checked = var&0x80, \
903 onToggleFunc = [&](bool state) \
904 { \
905 SETFLAG(var,0x80,state); \
906 }) \
907 )
908 #define _INTBTN_PANEL_HELPER_CAPTURE(var, ...) \
909 Columns<4>( \
910 Checkbox( \
911 text = "A", hAlign = 0.0, \
912 checked = var&0x1, \
913 onToggleFunc = [&, __VA_ARGS__](bool state) \
914 { \
915 SETFLAG(var,0x1,state); \
916 }), \
917 Checkbox( \
918 text = "B", hAlign = 0.0, \
919 checked = var&0x2, \
920 onToggleFunc = [&, __VA_ARGS__](bool state) \
921 { \
922 SETFLAG(var,0x2,state); \
923 }), \
924 Checkbox( \
925 text = "L", hAlign = 0.0, \
926 checked = var&0x4, \
927 onToggleFunc = [&, __VA_ARGS__](bool state) \
928 { \
929 SETFLAG(var,0x4,state); \
930 }), \
931 Checkbox( \
932 text = "R", hAlign = 0.0, \
933 checked = var&0x8, \
934 onToggleFunc = [&, __VA_ARGS__](bool state) \
935 { \
936 SETFLAG(var,0x8,state); \
937 }), \
938 Checkbox( \
939 text = "Ex1", hAlign = 0.0, \
940 checked = var&0x10, \
941 onToggleFunc = [&, __VA_ARGS__](bool state) \
942 { \
943 SETFLAG(var,0x10,state); \
944 }), \
945 Checkbox( \
946 text = "Ex2", hAlign = 0.0, \
947 checked = var&0x20, \
948 onToggleFunc = [&, __VA_ARGS__](bool state) \
949 { \
950 SETFLAG(var,0x20,state); \
951 }), \
952 Checkbox( \
953 text = "Ex3", hAlign = 0.0, \
954 checked = var&0x40, \
955 onToggleFunc = [&, __VA_ARGS__](bool state) \
956 { \
957 SETFLAG(var,0x40,state); \
958 }), \
959 Checkbox( \
960 text = "Ex4", hAlign = 0.0, \
961 checked = var&0x80, \
962 onToggleFunc = [&, __VA_ARGS__](bool state) \
963 { \
964 SETFLAG(var,0x80,state); \
965 }) \
966 )
967
968 #define INTBTN_PANEL_EX(var,ltxt,inftxt,...) \
969 Column(padding = 0_px, __VA_ARGS__, \
970 Row(padding = 0_px, \
971 Label(text = ltxt), \
972 INFOBTN(inftxt) \
973 ), \
974 _INTBTN_PANEL_HELPER(var) \
975 )
976 #define INTBTN_PANEL(var,ltxt,inftxt) \
977 Column(padding = 0_px, \
978 Row(padding = 0_px, \
979 Label(text = ltxt), \
980 INFOBTN(inftxt) \
981 ), \
982 _INTBTN_PANEL_HELPER(var) \
983 )
984
985 #define INTBTN_FRAME_EX(var,ltxt,inftxt,...) \
986 Frame(title = ltxt, __VA_ARGS__, \
987 info = inftxt, \
988 _INTBTN_PANEL_HELPER(var) \
989 )
990 #define INTBTN_FRAME(var,ltxt,inftxt) \
991 Frame(title = ltxt, \
992 info = inftxt, \
993 _INTBTN_PANEL_HELPER(var) \
994 )
995
996 //
997
998 #define _INTBTN_PANEL_HELPER2(var,ltxt) \
999 Label(text = ltxt), \
1000 _INTBTN_PANEL_HELPER(var) \
1001 )
1002 #define INTBTN_PANEL2_EX(var,ltxt,...) \
1003 Column(padding = 0_px, __VA_ARGS__, _INTBTN_PANEL_HELPER2(var,ltxt)
1004 #define INTBTN_PANEL2(var,ltxt) \
1005 Column(padding = 0_px, _INTBTN_PANEL_HELPER2(var,ltxt)
1006
1007 //
1008
1009 #define _EX_RBOX hAlign = 1.0,boxPlacement = GUI::Checkbox::boxPlacement::RIGHT
1010
1011 //}
1012
1013 #endif
1014